#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
基础智能体类，作为所有特定角色智能体的父类
"""
import sys
import uuid
import logging
import json  # <--- 添加导入 json 模块
from typing import Dict, List, Any, Optional
from datetime import datetime, timezone  # 导入 timezone 用于 UTC

# 假设 MemorySystem 在这里可以被导入（或至少类型提示可用）
try:
    from utils.memory_system import MemorySystem
except ImportError:
    MemorySystem = type(None)  # 使用 NoneType 进行类型提示

logger = logging.getLogger("AI-MindCare-System-BaseAgent")
sys.stdout.reconfigure(encoding='utf-8')
sys.stderr.reconfigure(encoding='utf-8')


class BaseAgent:
    """基础智能体类，提供共通的功能"""

    def __init__(self,
                 name: str,
                 role: str,
                 memory_system: Optional[MemorySystem] = None):
        """
        初始化基础智能体

        Args:
            name (str): 智能体名称.
            role (str): 智能体角色（例如 "doctor", "receptionist"）.
            memory_system (Optional[MemorySystem]): 记忆系统实例.

        Raises:
            ValueError: 如果 role 为空.
        """
        self.id = str(uuid.uuid4())
        self.name = name
        if not role: raise ValueError("Agent role cannot be empty")
        self.role = role
        self.memory_system = memory_system

        # 内部简单记忆（主要用于无 MemorySystem 时的备用）
        self._local_memory: Dict[str, Any] = {}
        self._conversation_history: List[Dict[str, Any]] = []

        logger.info(f"初始化 {self.role} 智能体: {name} (ID: {self.id})")

    def _now_utc_iso(self) -> str:
        """获取当前 UTC 时间的 ISO 格式字符串"""
        return datetime.now(timezone.utc).isoformat()

    def receive_message(self, message: Dict[str, Any]) -> Dict[str, Any]:
        """
        处理接收到的消息，包含记录和错误处理。
        """
        
        response = self._process_message(message)
        return response
    
    def receive_message_stream(self, message: Dict[str, Any]) -> Dict[str, Any]:
        """
        处理接收到的消息，包含记录和错误处理。
        """
        yield from self._process_message_stream(message)

       

    def _process_message(self, message: Dict[str, Any]) -> Dict[str, Any]:
        """
        处理消息的具体逻辑，【必须】被子类重写。

        Args:
            message: 接收到的消息对象，包含 'sender_id', 'sender_role', 'content' 等。

        Returns:
            响应消息字典，推荐使用 self.send_message() 构建。
            如果 Agent 需要结束当前流程或报告错误，应在 content 中包含明确的 'status' 字段。
        """
        raise NotImplementedError(
            f"子类 {self.__class__.__name__} 必须实现 _process_message 方法")
    
    def _process_message_stream(self, message: Dict[str, Any]) -> Dict[str, Any]:
        """
        处理消息的具体逻辑，【必须】被子类重写。

        Args:
            message: 接收到的消息对象，包含 'sender_id', 'sender_role', 'content' 等。

        Returns:
            响应消息字典，推荐使用 self.send_message() 构建。
            如果 Agent 需要结束当前流程或报告错误，应在 content 中包含明确的 'status' 字段。
        """
        raise NotImplementedError(
            f"子类 {self.__class__.__name__} 必须实现 _process_message 方法")

    def send_message(self, receiver_id: str,
                     content: Dict[str, Any]) -> Dict[str, Any]:
        """
        构造发送给其他智能体或Orchestrator的消息。

        Args:
            receiver_id: 接收者ID (例如 Orchestrator 的 ID 或另一个 Agent 的 ID)。
            content: 消息内容字典。应包含必要的处理结果、状态等信息。

        Returns:
            格式化的消息对象。
        """
        message = {
            "sender_id": self.id,
            "sender_name": self.name,
            "sender_role": self.role,
            "receiver_id": receiver_id,
            "content": content,  # content 应该包含 status 等信息
            "timestamp_utc": self._now_utc_iso()  # 使用 UTC 时间戳
        }
        return message
